
/*
 * log.h
 *
 *	编写时间: 2021/7/23
 *	编写者: wmh
 *
 *  功能描述：打印到标准输出，5级打印调试，分级颜色打印，包含时间，包含打印定位，可多模块调用
 *  		  1）支持打印到文件 2）支持多模块（运行起来为多进程）日志文件定制。
 *  
 *
 *	应用场景：1）项目只有一个进程 2）多进程输出到不同日志文件 3）多进程输出到同一个文件且没有备份需求
 *
 *	如果应用场景3）需要超定值备份，参见w2版
 *
 *
 */


#ifndef _LOG_H_
#define _LOG_H_


/*日志输出模式*/
typedef enum 
{
	LOG_MODE_STDOUT = 0, 
	LOG_MODE_FILE, 
} LOG_MODE;


//等级值越大，打印越多
typedef enum 
{
	LOG_L_OFF = 0,									/*关闭日志，无日志输出*/
	LOG_L_ERR,										/*严重错误，软件模块无法自行恢复*/
	LOG_L_WRN,										/*警告信息，已采取恢复措施的错误情况*/
	LOG_L_INF,										/*情报信息，描述正常事件流的信息消息*/
	LOG_L_DBG, 										/*调试信息，正常使用不需要的额外信息，打印最多*/
	
} LOG_L_TYPE;



/********************公有配置********************/

/*兼容标准输出*/
#define LOG_STDOUT_FD			stdout
#define LOG_DEFAULT_FD			LOG_STDOUT_FD

/*
以下为日志文件公有配置，在模块私有选项log_module_mode = LOG_MODE_FILE时有效
日志文件全路径见log_init()函数里的sprintf()函数的使用
*/
/*日志文件存储目录*/
#define COM_LOG_FILE_DIR		"/tmp/log_file/"

/*日志文件通用前缀，可以定义为项目名*/
#define COM_LOG_FILE_PREFIX		"log"

/*日志文件通用后缀*/
#define COM_LOG_FILE_POSTFIX	".log"

/*单个日志文件存储空间占用最大值*/
#define LOG_MAX_FileSize		(1*1024 * 1024)//1MBytes


/************************************************/


/*调试日志宏定义*/
#define DEBUG_PRINT_ERR 		1
#define LOG_PRINT_ERR(fmt, ...) do{ 									\
		if(DEBUG_PRINT_ERR) 											\
		{																\
		printf("error [%s] [line:%d] "fmt, __FILE__, __LINE__,##__VA_ARGS__); \
		}																\
		}while(0);



/*打印信息的显示颜色*/
#define HL_RED					"\033[0;31m"				//红色
#define HL_GREEN				"\033[0;32m"				//绿色
#define HL_YELLOW				"\033[1;33m"				//高亮黄色
#define HL_BLUE 				"\033[0;34m"				//蓝色
#define HL_CARMINE				"\033[0;35m"				//洋红色
#define HL_CYAN 				"\033[0;36m"				//青色
#define HL_GREY 				"\033[0;37m"				//灰色

#define NONE_COLOR				"\033[0m"					//清除颜色
#define NONE_COLOR1 			"\033[0;39m"				//清除颜色

/*
#define s "颜色测试"
#define PRINT_RED(s)	printf("\033[0;31m%s\033[0;39m\n",s)
#define PRINT_GREEN(s)		printf("\033[0;32m%s\033[0;39m\n",s)
#define PRINT_YELLOW(s) 	 printf("\033[0;33m%s\033[0;39m\n",s)
#define PRINT_BULE(s)	 printf("\033[0;34m%s\033[0;39m\n",s)
#define PRINT_PURPLE(s) 	 printf("\033[0;35m%s\033[0;39m\n",s)
*/

/*
	头部信息											 打印内容
	【日期时间】log类型：模块名：文件(所在行)：函数  打印内容
例：
[Jul 28 2021 09:06:54] ERROR:test0 test0.c(14):main{}  12qwha汉字qeqwexasda12 0
*/

#define LOG_ERR(fmt, ...) LOG(LOG_L_ERR, "%s(%d):%s{}  "fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#define LOG_WRN(fmt, ...) LOG(LOG_L_WRN, "%s(%d):%s{}  "fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#define LOG_INF(fmt, ...) LOG(LOG_L_INF, "%s(%d):%s{}  "fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#define LOG_DBG(fmt, ...) LOG(LOG_L_DBG, "%s(%d):%s{}  "fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)



/********************模块私有配置入口********************/
/*
模块日志输出模式
LOG_MODE		log_module_mode;

模块打印的最高等级
LOG_L_TYPE 		log_module_level ;

模块打印前缀，打印信息中用以区分模块
char *			log_module_prefix;


日志文件的模块前缀
如果和其他模块设置一样，就输出到同一文件
log_module_mode = LOG_MODE_FILE有效
日志文件全路径见log_init()函数里的sprintf()函数的使用
功能描述2）就是配置这个变量

char *			log_module_file_prefix;
*/


extern void log_init(LOG_MODE log_module_mode_p, LOG_L_TYPE log_module_level_p, char* log_module_prefix_p, char * log_module_file_prefix_p);

extern void LOG(LOG_L_TYPE enlog_level, const char * fmt, ...);


#endif /* _LOG_H_ */


